package com.own.component.common.util.desensitize;

import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.function.BiConsumer;
import java.util.function.Function;

/**
 * DesensitizeUtil
 *
 * @author chenxueli
 * @date 2022-06-15 03:14:15
 */
@Slf4j
public class DesensitizeUtil {

    /**
     * 设置脱敏信息
     *
     * @param content 脱敏的内容
     * @param rule    脱敏的规则
     * @param <TYPE>  类型
     * @return 脱敏后的内容
     */
    public static <TYPE> TYPE build(TYPE content, DesensitizeRule<TYPE> rule) {
        if (content == null) {
            return null;
        }
        return rule.apply(content);
    }

    /**
     * 设置脱敏信息
     *
     * @param t      脱敏的对象
     * @param getKey 获取的字段
     * @param setKey 设置的字段
     * @param rule   规则信息
     * @param <T>    类型信息
     * @param <TYPE> 脱敏内容的类型信息
     */
    public static <T, TYPE> void build(
            T t,
            Function<T, TYPE> getKey,
            BiConsumer<T, TYPE> setKey,
            DesensitizeRule<TYPE> rule
    ) {
        var content = getKey.apply(t);
        setKey.accept(t, build(content, rule));
    }

    /**
     * 设置脱敏信息
     *
     * @param list   脱敏的对象
     * @param getKey 获取的字段
     * @param setKey 设置的字段
     * @param rule   规则信息
     * @param <T>    类型信息
     * @param <TYPE> 脱敏内容的类型信息
     */
    public static <T, TYPE> void build(
            List<T> list,
            Function<T, TYPE> getKey,
            BiConsumer<T, TYPE> setKey,
            DesensitizeRule<TYPE> rule
    ) {
        list.parallelStream().forEach(item -> {
            var content = getKey.apply(item);
            setKey.accept(item, build(content, rule));
        });
    }

}
